home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / LIBIP / ACM_IO.C next >
C/C++ Source or Header  |  1999-09-11  |  7KB  |  300 lines

  1. /* 
  2.  * acm_io.c
  3.  * 
  4.  * Practical Algorithms for Image Analysis
  5.  * 
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9. /*
  10.  * ACM_IO
  11.  *
  12.  * routines to handle input files of type .acm
  13.  *
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include "ip.h"
  18.  
  19. /*
  20.  * acm_prm_size()
  21.  *   DESCRIPTION:
  22.  *     read first entry in data file to determine number of mode parameters
  23.  *   ARGUMENTS:
  24.  *     file: pointer to open FILE
  25.  *   RETURN VALUE:
  26.  *     number of mode parameters
  27.  */
  28.  
  29. int
  30. acm_prm_size (file)
  31.      FILE *file;
  32. {
  33.   int n_mode_parms;
  34.   int retval;
  35.  
  36.   if (((retval = fscanf (file, "%d ", &n_mode_parms)) == 0) || (retval == EOF)) {
  37.     printf ("wrong input file format!\n");
  38.     exit (1);
  39.   }
  40.   return (n_mode_parms);
  41. }
  42.  
  43.  
  44. /*
  45.  * acm_cont_parms()
  46.  *   DESCRIPTION:
  47.  *     read first entry in data file to determine number of parameters
  48.  *   ARGUMENTS:
  49.  *     file: pointer to open FILE
  50.  *   RETURN VALUE:
  51.  *     number of parameters
  52.  */
  53.  
  54. int
  55. acm_cont_parms (file)
  56.      FILE *file;
  57. {
  58.   int n_parms;
  59.   int retval;
  60.  
  61.   if (((retval = fscanf (file, "%d ", &n_parms)) == 0) || (retval == EOF)) {
  62.     printf ("wrong input file format!\n");
  63.     exit (1);
  64.   }
  65.   return (n_parms);
  66. }
  67.  
  68.  
  69. /*
  70.  * acm_record_size()
  71.  *   DESCRIPTION:
  72.  *     read entry in data file to determine number of records
  73.  *   ARGUMENTS:
  74.  *     file: pointer to open FILE
  75.  *   RETURN VALUE:
  76.  *     number of records
  77.  */
  78.  
  79. int
  80. acm_record_size (file)
  81.      FILE *file;
  82. {
  83.   long ln_pts;
  84.   int retval;
  85.  
  86.   if (((retval = fscanf (file, "%ld ", &ln_pts)) == 0) || (retval == EOF)) {
  87.     printf ("wrong input file format!\n");
  88.     exit (1);
  89.   }
  90.   return ((int) ln_pts);
  91.  
  92. }
  93.  
  94. /*
  95.  * acm_cont_parms()
  96.  *   DESCRIPTION:
  97.  *     read entry in data file to determine no moments and related parms
  98.  *   ARGUMENTS:
  99.  *     file: pointer to open FILE
  100.  *   RETURN VALUE:
  101.  *     number of moments
  102.  */
  103.  
  104. int
  105. acm_moments (file)
  106.      FILE *file;
  107. {
  108.   int n_moments;
  109.   int retval;
  110.  
  111.   if (((retval = fscanf (file, "%d ", &n_moments)) == 0) || (retval == EOF)) {
  112.     printf ("wrong input file format!\n");
  113.     exit (1);
  114.   }
  115.   return (n_moments);
  116.  
  117. }
  118.  
  119.  
  120. /*
  121.  * acm_shape_parms()
  122.  *   DESCRIPTION:
  123.  *     read entry in data file to determine shape parms
  124.  *   ARGUMENTS:
  125.  *     file: pointer to open FILE
  126.  *     c_len: curvature length (float *) 
  127.  *     area: area (float *)
  128.  *     pc_len: contour length (float *)
  129.  *     p2a: global shape parameter (float *)
  130.  *     e_bend: bend energy (float *)
  131.  *   RETURN VALUE:
  132.  *     none
  133.  */
  134.  
  135. void
  136. acm_shape_parms (file, c_len, area, pc_len, p2a, e_bend)
  137.      FILE *file;
  138.      float *c_len, *area, *pc_len, *p2a, *e_bend;
  139. {
  140.   int retval;
  141.  
  142.   if ((retval = fscanf (file, "%f %f %f %f %f",
  143.                c_len, area, pc_len, p2a, e_bend) == 0) || (retval == EOF)) {
  144.     printf ("wrong input file format!\n");
  145.     exit (1);
  146.   }
  147. }
  148.  
  149. /*
  150.  * get_acm_data()
  151.  *   DESCRIPTION:
  152.  *     read data from file of type .acm (generated by bdym.c)
  153.  *   ARGUMENTS:
  154.  *     file: pointer to open FILE
  155.  *     n_mode_parms: number of mode parms (int)
  156.  *     mode_parms: mode parms array (int *)
  157.  *     n_moments: number of moments (int)
  158.  *     moments: moments array (float *)
  159.  *     n_pts: number of points for power_spec and corr_fct (int)
  160.  *     power_spec: power spectrum array (float *)
  161.  *     corr_fct: correlation function array (float *)
  162.  *   RETURN VALUE:
  163.  *     none
  164.  */
  165.  
  166. void
  167. get_acm_data (file, n_mode_parms, mode_parms, n_moments, moments,
  168.               n_pts, power_spec, corr_fct)
  169.      FILE *file;
  170.      int n_mode_parms, n_moments, n_pts;
  171.      int *mode_parms;
  172.      float *moments;
  173.      float *power_spec, *corr_fct;
  174. {
  175.   int i;
  176.   int retval;
  177.  
  178.  
  179.   for (i = 0; i < n_mode_parms; i++) {
  180.     if (((retval = fscanf (file, "%d", (mode_parms + i))) == 0) || (retval == EOF)) {
  181.       printf ("wrong input file format for data!\n");
  182.       exit (1);
  183.     }
  184.   }
  185.  
  186.   for (i = 0; i < n_moments; i++) {
  187.     if (((retval = fscanf (file, "%f", (moments + i))) == 0) || (retval == EOF)) {
  188.       printf ("wrong input file format for data!\n");
  189.       exit (1);
  190.     }
  191.   }
  192.  
  193.   for (i = 0; i < n_pts; i++) {
  194.     if (((retval = fscanf (file, "%f %f", (power_spec + i), (corr_fct + i))) == 0) || (retval == EOF)) {
  195.       printf ("wrong input file format for data!\n");
  196.       exit (1);
  197.     }
  198.   }
  199. }
  200.  
  201.  
  202.  
  203. /*
  204.  * write_acm_file()
  205.  *   DESCRIPTION:
  206.  *     write power spectrum and autocorrelation function and parameters
  207.  *     to file of type .acm
  208.  *   ARGUMENTS:
  209.  *     file: pointer to open FILE
  210.  *     nv2: number of points for power_spec and corr_fct (long)
  211.  *     p_spec: power spectrum array (float *)
  212.  *     acf: correlation function array (float *)
  213.  *     moments: moments array (float *)
  214.  *     n_mom: number of moments (int)
  215.  *     mode_parms: mode parms array (int *)
  216.  *     n_mp: number of mode parms (int)
  217.  *     c_len: curvature length (double)
  218.  *     pix_ct: area (double)
  219.  *     res_c_len: contour length (double)
  220.  *     g_shape: global shape parameter (double)
  221.  *     e_bend: bend energy (double)
  222.  *   RETURN VALUE:
  223.  *     none
  224.  */
  225.  
  226. void
  227. write_acm_file (file, nv2, p_spec, acf, moments, n_mom, mode_parms, n_mp,
  228.                 c_len, pix_ct, res_c_len, g_shape, e_bend)
  229.      FILE *file;
  230.      long nv2;
  231.      float *p_spec, *acf, *moments;
  232.      double c_len, pix_ct, res_c_len, g_shape, e_bend;
  233.      int *mode_parms;
  234.      int n_mom, n_mp;
  235. {
  236.   int i;
  237.  
  238.   fprintf (file, "%d %d\n", n_mp, (int) nv2);
  239.  
  240. /*
  241.  * shape parameters
  242.  */
  243.   fprintf (file, "%f  %f  %f  %f  %f\n",
  244.            (float) c_len, (float) pix_ct, (float) res_c_len,
  245.            (float) g_shape, (float) e_bend);
  246.  
  247.   fprintf (file, "%d \n", n_mom);
  248.  
  249.   for (i = 0; i < n_mp; i++)
  250.     fprintf (file, "%d\n", *(mode_parms + i));
  251.  
  252.   for (i = 0; i < n_mom; i++)
  253.     fprintf (file, "%f\n", *(moments + i));
  254.  
  255.   for (i = 0; i < nv2; i++)
  256.     fprintf (file, "%f   %f\n", *(p_spec + i), *(acf + i));
  257.  
  258.   fprintf (file, "\n");
  259. }
  260.  
  261.  
  262.  
  263. /*
  264.  * write ZAHN-ROSKIES Fourier descriptors to file
  265.  */
  266. /*
  267.  * write_fd_file()
  268.  *   DESCRIPTION:
  269.  *     write ZAHN-ROSKIES Fourier descriptors to file
  270.  *   ARGUMENTS:
  271.  *     file: pointer to open FILE
  272.  *     n_order: order of Fourier descriptors (int)
  273.  *     a_n: Fourier descriptors coefficients (float *)
  274.  *     length: length (double)
  275.  *     area: area (double)
  276.  *     ratio: ratio (double)
  277.  *   RETURN VALUE:
  278.  *     none
  279.  */
  280.  
  281. void
  282. write_fd_file (file, n_order, a_n, length, area, ratio)
  283.      FILE *file;
  284.      int n_order;
  285.      float *a_n;
  286.      double length, area, ratio;
  287. {
  288.   int i;
  289.  
  290.  
  291.   fprintf (file, "%d\n", n_order);
  292.  
  293.   for (i = 0; i < n_order; i++)
  294.     fprintf (file, "%f\n", *(a_n + i));
  295.  
  296.   fprintf (file, "%lf\n%lf\n%lf\n", length, area, ratio);
  297.  
  298.   fprintf (file, "\n");
  299. }
  300.